"""
  爬虫调度器，也是程序入口
  create by 01 on 2020-02-29
"""
__author__ = '01'

import time
import traceback

import config
import html_downloader
import html_outputer
import html_parser
import url_manager


class SpiderMain(object):
    # 初始化各个对象
    def __init__(self):
        self.urls = url_manager.UrlManager()
        self.downloader = html_downloader.HtmlDownloader()
        self.parser = html_parser.HtmlParser()
        self.outputer = html_outputer.HtmlOutputer()

    def start(self, root_url):
        self.crawling(root_url)

    def crawling(self, root_url):
        """
        爬虫调度
        :param root_url:
        :return:
        """
        # 记录当前爬取的是第几个URL
        count = 1
        # 将入口页面的url添加到url管理器里
        self.urls.add_new_url(root_url)

        # 启动爬虫的循环
        while self.urls.has_new_url():
            # 获取待爬取的url
            new_url = self.urls.get_new_url()
            # 每爬取一个页面就在控制台打印一下
            print("爬取 - [ 序号:", count, ', url:', new_url, ']')

            try:
                # 启动下载器来下载该url的页面内容
                html_cont = self.downloader.use_chrome(new_url)
                # 调用解析器解析下载下来的页面内容，会得到新的url列表及新的数据
                new_urls, new_data = self.parser.parse(new_url, html_cont)
                if new_url is None or new_data is None:
                    count += 1
                    continue
                # 将新的url列表添加到url管理器里
                self.urls.add_new_urls(new_urls)
                # 收集解析出来的数据
                self.outputer.collect_data(new_data)

                # 当爬取到1000个页面时则停止爬取，避免出现无休止爬取
                if count == 1000:
                    break

                count += 1
            except:
                # 爬取时出现异常则在控制台中输出一段文字
                print("爬取失败:", new_url)
                traceback.print_exc()

        # 最后输出处理好的数据
        self.outputer.output_console()


if __name__ == '__main__':
    start_time = time.time()
    obj_spider = SpiderMain()
    # 启动爬虫
    obj_spider.start(config.ANIME_ROOT_URL)  # 爬日漫新番时间表
    # obj_spider.start(config.GUO_CHUANG_ROOT_URL)  # 爬国创新番时间表
    print("总共耗时：", int((time.time() - start_time)), "秒")
